home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / diskutil / blank.arc / blank.st next >
Text File  |  1989-03-21  |  2KB  |  122 lines

  1. /*
  2.  *    BLANK
  3.  *
  4.  *    A program to blank out a floppy disk.
  5.  *    The disk must have been formatted before.
  6.  *    Much faster than reformatting or even
  7.  *    deleting all that's on the disk by files.
  8.  *
  9.  *    For the Atari ST.
  10.  *
  11.  *    By Moshe Braner, 880406
  12.  */
  13.  
  14. #include <osbind.h>
  15. #undef  Getbpb
  16. #define Getbpb(a)    bios(7, a)
  17.  
  18. #define WORD int    /* 16 bits, 'int' in Laser C */
  19.  
  20. #define OK    0
  21.  
  22. #define READ    0
  23. #define WRITE    1
  24.  
  25. typedef struct bpb {
  26.     WORD    recsiz;
  27.     WORD    clsiz;
  28.     WORD    clsizb;
  29.     WORD    rdlen;
  30.     WORD    fsiz;
  31.     WORD    fatrec;
  32.     WORD    datrec;
  33.     WORD    numcl;
  34.     WORD    bflags;
  35. } BPB;
  36.  
  37. char buf[7*512];
  38.  
  39. /*
  40.  * Print message and quit.
  41.  */
  42. error(msg)
  43.     char msg[];
  44. {
  45.     Cconws(msg);
  46.     Cconws("\007\r\n\n\tHit any key ");
  47.     Bconin(2);
  48.     exit(0);
  49. }
  50.  
  51. main()
  52. {
  53.     int    i, bps, spc, fats, dir, spd, spf, dat, sec, secs, drv;
  54.     BPB    *bpb;
  55.  
  56.     char    *msg1 = "\r\n\tError reading!";
  57.     char    *msg2 = "\r\n\tError writing!";
  58.  
  59.     Cconws("\033E\r\n\n\tBLANK 1.0\tby Moshe Braner");
  60.  
  61. loop:    Cconws("\r\n\n\tEnter letter label of drive to blank: ");
  62.     drv = Bconin(2);
  63.     if (drv == 0x1B)
  64.         exit(0);
  65.     if (drv>='a' && drv<='p')
  66.         drv += 'A'-'a';
  67.     Bconout(2, drv);
  68.     if (drv < 'A' || drv > 'P')
  69.         goto loop;
  70.     drv -= 'A';        /* 0=A, 1=B, ... */
  71.  
  72.     /* get disk parameters from bios parameter block */
  73.  
  74.     Cconws("\r\n\tInsert disk to blank, hit any key: ");
  75.     i = Bconin(2);
  76.     if (i == 0x1B)
  77.         exit(0);
  78.     bpb = (BPB *) Getbpb(drv);
  79.     if (bpb==0)
  80.         error(msg1);
  81.     dir = bpb->rdlen;        /* length of dir in sectors    */
  82.     spf = bpb->fsiz;        /* sectors per FAT        */
  83.     dat = bpb->datrec;        /* no. of first data sector    */
  84.  
  85.     /* read FAT from disk to RAM */
  86.  
  87.     sec = dat - dir - 2*spf;
  88.     if (Rwabs (READ, buf, spf, sec, drv) != OK)
  89.         error(msg1);
  90.  
  91.     /* zero out everything beyond the first 3 bytes */
  92.  
  93.     for (i=3; i<7*512; i++)
  94.         buf[i] = 0;
  95.  
  96.     /* write it back, to both FATs */
  97.  
  98.     Cconws("\007\r\n\n\t\tWARNING:");
  99.     Cconws("\r\n\tAbout to erase ALL data in drive ");
  100.     Bconout(2,drv+'A');
  101.     Cconws(".\r\n\n\t\tProceed (y/n)? ");
  102.     i = Bconin(2);
  103.     if (i!='y' && i!='Y')
  104.         exit(0);
  105.  
  106.     if (Rwabs (WRITE, buf, spf, sec, drv) != OK)
  107.         error(msg2);
  108.     sec += spf;
  109.     if (Rwabs (WRITE, buf, spf, sec, drv) != OK)
  110.         error(msg2);
  111.  
  112.     /* zero out root directory */
  113.  
  114.     buf[0] = buf[1] = buf[2] = 0;
  115.     sec = dat - dir;
  116.     if (Rwabs (WRITE, buf, dir, sec, drv) != OK)
  117.         error(msg2);
  118.  
  119.     error(".\r\n\n\tBLANK finished, no errors.");
  120. }
  121.  
  122.